package com.erp.hr.base.service;

import com.erp.hr.base.model.BaseModel;
import com.erp.hr.base.vo.LegalityResultVO;
import com.erp.hr.dao.model.HrStaffInfoRO;
import org.redragon.framework.hibernate.DaoCRUDIF;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 业务层基类
 * @Author: syz
 * @blame syz
 * @CreateTime: 2021/4/6
 */
public interface BaseService<T> extends DaoCRUDIF<T, T> {

    /**
     * 为单个对象添加完整信息
     * @param t 需要添加完整信息的对象
     * @return 添加完整信息后的对象
     */
    T addCompleteData(T t);

    /**
     * 为集合添加完整信息
     * @param list 需要添加完整信息的集合
     * @return 添加完整信息后的集合
     */
    List<T> addCompleteData(List<T> list);

    /**
     * 获取集合元素的id并以集合形式返回
     * @param list 需要获取id集合的集合
     * @param <E> BaseModel的子类
     * @return id集合
     */
    <E extends BaseModel> Set<Long> getIdList(List<E> list);

    /**
     * 获取集合元素的id并返回非空集合
     * @param list 需要获取id集合的集合
     * @param <E> BaseModel的子类
     * @return 非空id集合
     */
    <E extends BaseModel> Set<Long> getNotEmptyIdList(List<E> list);

    /**
     * 校验数据合法性
     * @param t 需要校验的对象
     * @return 校验结果
     */
    LegalityResultVO isLegalityData(T t);

    /**
     * 保存对象
     * @param t 需要保存的对象
     * @return 保存结果
     */
    boolean save(T t);

    /**
     * 更新对象
     * @param t 需要更新的对象
     * @return 更新结果
     */
    boolean update(T t);

    /**
     * 根据id删除对象及相关信息
     * @param id 需要删除的对象
     * @return 删除结果
     */
    boolean linkDelete(Long id);

    /**
     * 根据键获取数据字典集合
     * @param key 键
     * @return 数据字典集合
     */
    Map<String, String> getDictByKey(String key);

    /**
     * 获取当前登录职员信息
     * @return 职员信息
     */
    HrStaffInfoRO getStaffInfo();

}